
import Page
import allure
from time import sleep
from Base.base import Base
from Base.get_driver import get_driver
from selenium.webdriver.common.by import By

"""Page_App类，作为应用列表页,继承Base类"""

class PageApp(Base):

# ---------------------------------------[单个操作]依赖/组合业务/断言使用-----------------------------------------------

    @allure.step(title="点击 创建应用")
    def page_click_create_btn(self):
        self.click_element(Page.app_create_btn)

    @allure.step(title="输入 应用名")
    def page_enter_app_name(self, app_name):
        self.send_element(Page.app_name_input, app_name)

    @allure.step(title="输入 更新说明")
    def page_enter_description_description(self, description):
        self.send_element(Page.app_description_input, description)

    @allure.step(title="通过app_name -->点击修改应用")
    def page_click_modify_btn(self, app_name):
        if len(app_name) > 20:
            app_name = app_name[:20]
        # path = "//td[contains(text(),'{}')]/../td[8]/span/span[2]".format(app_name)
        path = "//td[contains(text(),'{}')]/../td[8]/span/span".format(app_name)
        return self.search_element((By.XPATH, path), timeout=5).click()

    @allure.step(title="获取所有应用名元素")
    def page_search_app_names(self):
        return self.search_elements(Page.app_list_names_ele)

    @allure.step(title="获取所有应用描述元素")
    def page_search_app_descriptions(self):
        return self.search_elements(Page.app_list_descriptions_ele)

    @allure.step(title="获取弹框提示语元素")
    def page_search_input_explain(self):
        sleep(2)
        return self.search_elements(Page.app_input_explain)

#---------------------------------------------------[依赖]组合业务/断言使用---------------------------------------------

    # 依赖 -->返回所有应用名【应用断言依赖】返回list
    @allure.step(title="获取所有应用名")
    def page_get_current_app_names(self):
        try:
            sleep(3)
            # 调用 定位应用列表所有应用名元素
            app_names = self.page_search_app_names()
            names = []
            for i in range(0, len(app_names)):
                names.append(app_names[i].text)
                i += 1
            allure.attach("描述", "获取所有应用名为：{}".format(names))
            return names
        except Exception as e:
            allure.attach("失败描述", "返回所有应用名失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            return ""

    # 依赖 -->返回所有应用描述【应用断言依赖】返回list
    @allure.step(title="获取所有应用描述")
    def page_get_current_app_descriptions(self):
        try:
            sleep(3)
            # 调用 定位应用列表所有应用描述元素
            app_names = self.page_search_app_descriptions()
            names = []
            for i in range(0, len(app_names)):
                names.append(app_names[i].text)
                i += 1
            allure.attach("描述", "获取所有应用描述为：{}".format(names))
            return names
        except Exception as e:
            allure.attach("失败描述", "返回所有应用描述失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            return ""

#---------------------------------------------------[组合业务]test脚本使用----------------------------------------------

    # 组合业务方法  -->创建应用业务直接调用
    @allure.step(title="创建应用操作")
    def add_app(self, app_name, description):
        try:
            # 调用 点击创建应用按钮
            self.page_click_create_btn()
            # 调用 输入应用名
            self.page_enter_app_name(app_name)
            # 调用 输入更新说明
            self.page_enter_description_description(description)
            # 调用 点击确定
            self.page_click_accept()
            sleep(3)
        except Exception as e:
            allure.attach("失败描述", "创建应用失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            # 刷新
            self.refresh_current_page()
            assert False

    # 组合业务方法  -->取消创建应用业务直接调用
    @allure.step(title="取消创建应用操作")
    def add_app_cancel(self):
        try:
            # 调用 点击创建应用按钮
            self.page_click_create_btn()
            # 调用 输入应用名
            self.page_enter_app_name("cancel_app")
            # 调用 输入更新说明
            self.page_enter_description_description("cancel_description")
            # 调用 点击取消
            self.page_click_cancel()
            sleep(3)
        except Exception as e:
            allure.attach("失败描述", "取消创建应用失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            # 刷新
            self.refresh_current_page()
            assert False

    # 组合业务方法  -->修改应用业务直接调用
    @allure.step(title="修改应用操作")
    def edit_app(self, old_name, app_name=1, description=1):
        try:
            # 调用 点击修改应用按钮
            self.page_click_modify_btn(old_name)
            # 调用 输入应用名
            self.page_enter_app_name(app_name)
            # 调用 输入更新说明
            self.page_enter_description_description(description)
            sleep(5)
            # 调用 点击确定
            self.page_click_accept()
        except Exception as e:
            allure.attach("失败描述", "修改应用失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            # 刷新
            self.refresh_current_page()
            assert False

    # 组合业务方法  -->修改应用为空业务直接调用
    @allure.step(title="修改应用为空操作")
    def edit_app_empty(self, old_name, app_name, description):
        try:
            # 调用 点击删除应用按钮
            self.page_click_modify_btn(old_name)
            if app_name == "":
                # 调用 清空应用名
                self.base_input_empty(Page.app_name_input)
            if description == "":
                # 调用 清空更新说明
                self.base_input_empty(Page.app_description_input)
            # 调用 点击确定
            self.page_click_accept()
            sleep(3)
        except Exception as e:
            allure.attach("失败描述", "修改应用为空失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            # 刷新
            self.refresh_current_page()
            assert False

    # 组合业务方法  -->取消修改应用业务直接调用
    @allure.step(title="取消修改应用操作")
    def edit_app_cancel(self):
        try:
            # 调用 点击删除应用按钮
            self.page_click_modify_btn("app_auto")
            # 调用 输入应用名
            self.page_enter_app_name("上天入地")
            # 调用 输入更新说明
            self.page_enter_description_description("打老虎啊")
            # 调用 点击确定
            self.page_click_cancel()
        except Exception as e:
            allure.attach("失败描述", "取消修改应用失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            # 刷新
            self.refresh_current_page()
            assert False

#----------------------------------------------------[断言]test脚本使用-------------------------------------------------

    # 断言  -->应用名在页面中【增加/修改应用断言使用】
    @allure.step(title="断言应用信息在页面中")
    def if_new_app_name_exits(self, app_name=1, description=1):
        try:
            # 调用 断言 -->keyword in expect结果
            num = 0
            if app_name == 1:
                app_name = "app_auto"
            if len(app_name) > 20:
                app_name = app_name[:20]
            if self.base_if_include(app_name, self.page_get_current_app_names()):
                num += 1
            if description == 1:
                description = "description_auto"
            if len(description) > 20:
                description = description[:20]
            if self.base_if_include(description, self.page_get_current_app_descriptions()):
                num += 1
            # 调用 # 断言 -->actual结果 == expect结果
            if self.base_if_equal(num, 2):
                return True
        except Exception as e:
            allure.attach("失败描述", "断言应用信息在页面中,失败原因为：{}".format(e))
            # 截图
            self.screen_page()
            # 刷新
            self.refresh_current_page()
            return False

    # 断言 -->输入框提示语文本 == 预期
    @allure.step(title="断言输入框提示语文本 == 预期")
    def if_input_explain(self, expect_result):
        try:
            # 调用 定位输入框提示语元素
            explain_ele = self.page_search_input_explain()
            # 判断文本与预期一致
            num = 0
            for i in range(0, len(explain_ele)):
                if explain_ele[i].text == expect_result:
                    num += 1
            # 刷新
            self.refresh_current_page()
            # 调用 断言 -->actual结果 == expect结果
            if self.base_if_equal(num, len(explain_ele)) and num > 0:
                allure.attach("断言描述","断言成功，输入框提示语文本 == 预期")
                return True
            else:
                allure.attach("断言描述","断言失败，输入框提示语文本 != 预期")
                return False
        except Exception as e:
            allure.attach("失败描述", "断言输入框提示语文本 == 预期,失败原因为：{}".format(e))
            # 刷新
            self.refresh_current_page()
            return False

    # 设置每页显示条数为40
    # def sel_max_page_num(self):
    #     try:
    #         # 点击选择显示条数下拉框
    #         self.click_element(page.com_sel_page_num_btn)
    #         # 选择最大的数量
    #         self.click_element(page.option_last)
    #     except Exception as e:
    #         print("设置页面显示条数错误")
    #         allure.attach("错误说明", "设置显示页面条数操作失败")
    #         assert False


if __name__ == '__main__':
    p = PageApp(get_driver())
    # 登录
    p.send_element(Page.login_email_id, Page.test_user)
    p.send_element(Page.login_password_id, Page.test_pwd)
    p.click_element(Page.login_btn_id)
    # 测试 创建应用
    # p.add_app("create", "one")
    # 测试 应用名在页面中
    # p.if_new_app_name_exits()
    # 测试 修改应用
    # p.edit_app("好好学习", "", "")
    # 测试 取消创建应用
    # p.add_app_cancel()
    # 测试 创建应用为空
    # p.add_app("","")
    # 测试 修改应用为空
    # p.edit_app_empty("好好学习", "", "")
    # 断言 -->输入框提示语文本 == 预期
    p.if_input_explain("请填写")
    # print("天天向上：",p.page_search_input_explain())
